package com.nantian.common.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

import java.text.SimpleDateFormat;
import java.util.Map;

/**
 * <p>ClassName: JackJsonUtils</p >
 * <p>Description: json工具类，提供字符串、bean、map之间的相互转换。底层基于jackjson</p >
 * <p>Copyright: Copyright©2014</p >
 * <p>Company: 广州南天电脑系统有限公司</p >
 * <p>Date: 2021-04-23</p >
 *
 * @author 刘晓辉
 * @version 1.0
 */
public class JsonUtils {
    private final static ObjectMapper MAPPER;
    static {
        MAPPER = new ObjectMapper();
        // 忽略json中在对象不存在对应属性
        MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 忽略空bean转json错误
        MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        // 允许序列化空的POJO类
        MAPPER.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        // 将long类型转成String字符串
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        MAPPER.registerModule(simpleModule);
        // 将Date类型输出 yyyy-MM-dd HH:mm:ss 格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        MAPPER.setDateFormat(dateFormat);

    }

    /**
     * 将对象转换成json字符串
     * String 类型 null : ""
     * Map 类型 null : {}
     * List 类型 null : []
     * @param object 对象
     * @return json字符串
     */
    public static String toJsonString(Object object) {
        try {
            return MAPPER.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 将json字符串转换成JSONObject对象
     * @param text json字符串
     * @return JSONObject对象
     */
    public static Map<String, Object> parseObject(String text) {
        return parseObject(text, Map.class);
    }

    /**
     * 将json字符串转换成java bean对象
     * @param text json字符串
     * @param clazz java bean class
     * @param <T> 对象类型
     * @return java bean对象
     */
    public static <T> T parseObject(String text, Class<T> clazz) {
        try {
            return MAPPER.readValue(text, clazz);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

}
